package com.tro.common.util.clazz;

import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Map;

import com.tro.common.util.date.DateUtil;


/**
 * 
 * @author lk
 *
 */
public class Tool {
	public static Map<String, Object> toMap(Object obj) {

		Map<String, Object> returnMap = new HashMap<String, Object>();

		if (obj == null) {
			return null;
		}
		// 返回 Field 对象的一个数组，这些对象反映此 Class 对象所表示的类或接口所声明的所有字段。
		Field[] fields = obj.getClass().getDeclaredFields();

		for (int i = 0; i < fields.length; i++) {
			try {
				// 返回一个 Field 对象，该对象反映此 Class 对象所表示的类或接口的指定已声明字段。
				Field f = obj.getClass().getDeclaredField(fields[i].getName());
				f.setAccessible(true);
				Object o = f.get(obj);

				returnMap.put(fields[i].getName(), o);
			} catch (NoSuchFieldException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (IllegalArgumentException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (IllegalAccessException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}

		return returnMap;
	}

	/**
	 * 给实体赋值
	 * 
	 * @param model
	 */
	public static Object setValue(Object model, Map<String, String> map) {
		Field[] field = model.getClass().getDeclaredFields(); // 获取实体类的所有属性，返回Field数组

		try {
			for (int j = 0; j < field.length; j++) { // 遍历所有属性
				String name = field[j].getName(); // 获取属性的名字
				String mapname = name;
				name = name.substring(0, 1).toUpperCase() + name.substring(1); // 将属性的首字符大写，方便构造get，set方法
				String type = field[j].getGenericType().toString(); // 获取属性的类型
				if (type.equals("class java.lang.String")) { // 如果type是类类型，则前面包含"class "，后面跟类名
					if (map.get(mapname) != null) {
						Method m = model.getClass().getMethod("set" + name,
								String.class);

						m.invoke(model, map.get(mapname));
					}
				}
				if (type.equals("class java.lang.Integer")) {
					if (map.get(mapname) != null) {
						Method m = model.getClass().getMethod("set" + name,
								Integer.class);
						m.invoke(model, Integer.parseInt(map.get(mapname)));
					}
				}
				// Boolean 不考虑
				// if (type.equals("class java.lang.Boolean")) {
				// Method m = model.getClass().getMethod("get" + name);
				// Boolean value = (Boolean) m.invoke(model);
				// if (value == null) {
				// m = model.getClass().getMethod("set"+name,Boolean.class);
				// m.invoke(model, false);
				// }
				// }
				// 日期类型必须是yyyy-MM-dd
				if (type.equals("class java.util.Date")) {
					if (map.get(mapname) != null) {
						Method m = model.getClass().getMethod("set" + name,
								java.util.Date.class);
						m.invoke(model, DateUtil.string2Date(map.get(mapname),
								"yyyy-MM-dd"));
					}
				}
			}
		} catch (NoSuchMethodException e) {
			e.printStackTrace();
		} catch (SecurityException e) {
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			e.printStackTrace();
		} catch (IllegalArgumentException e) {
			e.printStackTrace();
		} catch (InvocationTargetException e) {
			e.printStackTrace();
		}
		return model;
	}

	public static Object get(String entityClass) {
		Object a = null;
		try {
			a = Class.forName(entityClass).newInstance();
		} catch (InstantiationException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return a;
	}

	public static Object cleanxss(Object model){
		Map map=tocleanXSSMap(model);
		Object newobj=setValue(model,map);
		return newobj;
	}

	public static Map<String, Object> tocleanXSSMap(Object obj) {

		Map<String, Object> returnMap = new HashMap<String, Object>();

		if (obj == null) {
			return null;
		}
		// 返回 Field 对象的一个数组，这些对象反映此 Class 对象所表示的类或接口所声明的所有字段。
		Field[] fields = obj.getClass().getDeclaredFields();
 
		for (int i = 0; i < fields.length; i++) {
			try {
				// 返回一个 Field 对象，该对象反映此 Class 对象所表示的类或接口的指定已声明字段。
				Field f = obj.getClass().getDeclaredField(fields[i].getName());
				f.setAccessible(true);
				Object o = f.get(obj);				
//cleanXSS fangfan  StringUtil.cleanXSS
				if(o!=null && o!="")	
//					try
//				{
//					if(o.toString().contains("CST"))
//					{}
//					
					if(fields[i].getGenericType().toString().equals("class java.util.Date")){
						//returnMap.put(fields[i].getName(), o.toString());
					}
					/*else if(null== DateUtil.dtSimpleFormat(o))*/
					else
						 returnMap.put(fields[i].getName(), o.toString());
//				}
//				catch(Exception ex)
//				{
//					returnMap.put(fields[i].getName(), StringUtilto.cleanXSS(o.toString()));
//				}
			} catch (NoSuchFieldException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (IllegalArgumentException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (IllegalAccessException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}

		return returnMap;
	}
}
